package cc.magicjson.example.demo.monitor.watch;

import java.io.IOException;
import java.nio.file.*;

import static java.nio.file.FileSystems.getDefault;

public class WatchServiceExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 获取文件系统的WatchService  
        WatchService watchService = getDefault().newWatchService();

        // 指定要监视的目录  
        Path directory = Paths.get("F:\\github-project\\demo\\file");

        // 注册目录到WatchService，并监听ENTRY_CREATE和ENTRY_DELETE事件  
        directory.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE);

        // 无限循环，等待事件  
        while (true) {
            // 获取下一个事件，如果没有事件，则线程会阻塞  
            WatchKey key = watchService.take();

            // 遍历事件  
            for (WatchEvent<?> event : key.pollEvents()) {
                WatchEvent.Kind<?> kind = event.kind();

                // 上下文是目录本身，事件是相对于这个目录的  
                WatchEvent<Path> ev = (WatchEvent<Path>) event;
                Path fileName = ev.context();

                System.out.println(kind.name() + ": " + fileName);

                // 根据事件类型，你可以添加相应的处理逻辑  
                if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
                    System.out.println("File created: " + fileName);
                } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
                    System.out.println("File deleted: " + fileName);
                    System.out.println();
                }
            }

            // 重置WatchKey，以便接收后续事件 WatchKey只能接受一次 需要重置 持续监听
            boolean valid = key.reset();
            // 出现问题后跳出循环
            if (!valid) {
                break;
            }
        }
    }
}